package pl.smath.worksheet.results;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

/**
 * Klasa ta zawiera rozwiązanie zadania, krok po kroku, a zatem listę kolejnych 
 * przekształceń algebraicznych wraz z opisami czynności. W przyszłości klasa to 
 * będzie też serializować owe wyniki do postaci np. xml, a na razie oferuje prostą
 * serializację do tekstu.
 * 
 * @author Piotr Mech
 *
 */

public class Resolution extends Vector<OneStep>{
	 
	// Lista kolejnych przekształceń składających się na rozwiązanie zadania.
	private List<OneStep> steps = new ArrayList<OneStep>();

	// Zawiera aktualną pozycje elementu listy przekształceń.
	private int stepsPos = 0;
	
	/**
	 * Dodaje obiekt z kolejnym krokiem rozwiązania zadania. 
	 * @param step
	 */
	public void addStep(OneStep step){
		
		steps.add(step);
	}
	
	/**
	 * Zwraca pierwszy element listy kroków przekształceń.
	 * @return
	 */
	public OneStep first(){
		
		stepsPos = 0;
		if (steps.size() > 0)
			return steps.get(0);
		else
			return null;
	}
	
	
	public int size(){
		return steps.size();
	}
	
	/**
	 * Dostep do listy kroków
	 * @return
	 */
	public Iterator<OneStep> getSteps(){
		return steps.iterator();
	}
	
	/**
	 * Zwraca ostatni element listy kroków przekształceń.
	 * @return
	 */
	public OneStep last(){
		
		stepsPos = steps.size() - 1;
		if (stepsPos >= 0)
			return steps.get(stepsPos);
		else
			return null;
	}
	
	/**
	 * Zwraca kolejny element listy kroków przekształceń.
	 * @return
	 */
	public OneStep next(){
		
		if (steps.size() > stepsPos+1){
			stepsPos++;
			return steps.get(stepsPos);
		}
		else
			return null;
	}
	
	/**
	 * Podstawowa serializacja obiektu Resolution. Zwracana jest 
	 * lista w postaci:
	 * WYRAŻENIE		//OPIS
	 * 3*x=5			//przenieśliśmy wolny wyraz.
	 * x=5/3			//dzielimy przez 3.
	 * x=1.66			//obliczmy x.  
	 */
	public String toString(){
		
		String serialized = ""; 
		String newline = "\n";//System.getProperty("line.separator"); Nie można używać klasy system w GWT

		for (OneStep step:steps){
			serialized = serialized.concat(step.toString()).concat(newline);
		}
		
		return serialized;
	}
	
	/**
	 * Funkcja tworząca kopie tego obiektu 
	 */
	public Resolution copy(){
		Resolution copy = new Resolution();
		for (OneStep step: steps){
			copy.steps.add(step);
		}
		return copy;
	}
}
